package com.yylending.las.common.widgets;

import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.ColorRes;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.AppCompatEditText;
import android.text.Editable;
import android.text.TextPaint;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.inputmethod.InputMethodManager;
import com.yyfax.common.tools.DensityUtil;
import com.yylending.las.R;


/**
 * 带下划线的EditText
 */
public class UnderLineEditText extends AppCompatEditText implements TextWatcher{

    private int mFigures;//需要输入的位数
    private int mSingleCharMargin;//字符之间的间距
    private int mBottomSelectedColor;//底部选中的颜色
    private int mBottomNormalColor;//未选中的颜色
    private float mBottomLineHeight;//底线的高度
    private int mSelectedBackgroundColor;//选中的背景颜色
	private float mBottomLineMarginTop;

    private OnVerificationCodeChangedListener mOnCodeChangedListener;
    private int mCurrentPosition = 0;
    private int mEachRectLength = 0;//每个矩形的边长
    private Paint mSelectedBackgroundPaint;
    private Paint mNormalBackgroundPaint;
    private Paint mBottomSelectedPaint;
    private Paint mBottomNormalPaint;

    public UnderLineEditText(Context context) {
        this(context, null);
    }

    public UnderLineEditText(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public UnderLineEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttrs(attrs);
        setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent));// 去掉系统自带下划线
        initPaint();
        setFocusableInTouchMode(true);
		disableCopyPaste();
        super.addTextChangedListener(this);
    }

    /**
     * 初始化paint
     */
    private void initPaint() {
        mSelectedBackgroundPaint = new Paint();
        mSelectedBackgroundPaint.setColor(mSelectedBackgroundColor);
        mNormalBackgroundPaint = new Paint();
        mNormalBackgroundPaint.setColor(getColor(android.R.color.transparent));

        mBottomSelectedPaint = new Paint();
        mBottomNormalPaint = new Paint();
        mBottomSelectedPaint.setColor(mBottomSelectedColor);
        mBottomNormalPaint.setColor(mBottomNormalColor);
        mBottomSelectedPaint.setStrokeWidth(mBottomLineHeight);
        mBottomNormalPaint.setStrokeWidth(mBottomLineHeight);
    }

    /**
     * 初始化Attrs
     */
    private void initAttrs(AttributeSet attrs) {
        TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.under_line_edit_text);
        mFigures = ta.getInteger(R.styleable.under_line_edit_text_figures, 4);
        mSingleCharMargin = (int) ta.getDimension(R.styleable.under_line_edit_text_singleCharMargin, 0);
        mBottomSelectedColor = ta.getColor(R.styleable.under_line_edit_text_bottomLineSelectedColor,
                getCurrentTextColor());
        mBottomNormalColor = ta.getColor(R.styleable.under_line_edit_text_bottomLineNormalColor,
                getColor(android.R.color.darker_gray));
        mBottomLineHeight = ta.getDimension(R.styleable.under_line_edit_text_bottomLineHeight,
				DensityUtil.dip2px(getContext(),5));
        mSelectedBackgroundColor = ta.getColor(R.styleable.under_line_edit_text_selectedBackgroundColor,
                getColor(android.R.color.darker_gray));
		mBottomLineMarginTop = ta.getDimension(R.styleable.under_line_edit_text_bottomLineMarginTop, DensityUtil.dip2px(getContext(),10));
        ta.recycle();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthResult = 0, heightResult = 0;
        //最终的宽度
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        if (widthMode == MeasureSpec.EXACTLY) {
            widthResult = widthSize;
        } else {
            widthResult = DensityUtil.getInstance(getContext()).getWindowWidth();
        }
        //每个矩形形的宽度
        mEachRectLength = (widthResult - (mSingleCharMargin * (mFigures - 1))) / mFigures;
		Paint paint = getPaint();
		Paint.FontMetrics fontMetrics = paint.getFontMetrics();
		float fontH = fontMetrics.descent - fontMetrics.ascent;
		int viewTotalH = (int)(mBottomLineHeight + mBottomLineMarginTop + fontH);

        //最终的高度
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        if (heightMode == MeasureSpec.EXACTLY) {
            heightResult = heightSize;
        } else {
            heightResult = viewTotalH;
        }
        setMeasuredDimension(widthResult, heightResult);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        mCurrentPosition = getText().length();
        int width = mEachRectLength - getPaddingLeft() - getPaddingRight();
        int height = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
        for (int i = 0; i < mFigures; i++) {
            canvas.save();
            int start = width * i + i * mSingleCharMargin;
            int end = width + start;
            //画一个矩形
            if (i == mCurrentPosition) {//选中的下一个状态
                canvas.drawRect(start, 0, end, height, mSelectedBackgroundPaint);
            } else {
                canvas.drawRect(start, 0, end, height, mNormalBackgroundPaint);
            }
            canvas.restore();
        }

        String value = getText().toString();
        for (int i = 0; i < value.length(); i++) {
            canvas.save();
            int start = width * i + i * mSingleCharMargin;
            float x = start + width / 2;
            TextPaint paint = getPaint();
            paint.setTextAlign(Paint.Align.CENTER);
            paint.setColor(getCurrentTextColor());
            /*Paint.FontMetrics fontMetrics = paint.getFontMetrics();
            float baseline = (height - fontMetrics.bottom + fontMetrics.top) / 2
                    - fontMetrics.top;*/
			float baseline = height - mBottomLineHeight - mBottomLineMarginTop;
            canvas.drawText(String.valueOf(value.charAt(i)), x, baseline, paint);
            canvas.restore();
        }

        for (int i = 0; i < mFigures; i++) {
            canvas.save();
            float lineY = height - mBottomLineHeight / 2;
            int start = width * i + i * mSingleCharMargin;
            int end = width + start;
            if (i < mCurrentPosition) {
                canvas.drawLine(start, lineY, end, lineY, mBottomSelectedPaint);
            } else {
                canvas.drawLine(start, lineY, end, lineY, mBottomNormalPaint);
            }
            canvas.restore();
        }
    }

	@Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        mCurrentPosition = getText().length();
        postInvalidate();
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        mCurrentPosition = getText().length();
        postInvalidate();
        if (mOnCodeChangedListener != null) {
            mOnCodeChangedListener.onVerCodeChanged(getText(), start, before, count);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
        mCurrentPosition = getText().length();
        postInvalidate();
        if (getText().length() == mFigures) {
            if (mOnCodeChangedListener != null) {
                mOnCodeChangedListener.onInputCompleted(getText());
            }
        } else if (getText().length() > mFigures) {
            getText().delete(mFigures, getText().length());
        }
    }

	/**
	 * 处理EditText双击会出现选中以及知识标识的问题.
	 * @param event
	 * @return
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()){
			case MotionEvent.ACTION_DOWN:
				InputMethodManager imm = (InputMethodManager) (((((ContextWrapper)getContext()).getBaseContext()))
						.getSystemService(Context.INPUT_METHOD_SERVICE));
				imm.showSoftInput(this,InputMethodManager.SHOW_IMPLICIT);
				return true;
			case MotionEvent.ACTION_UP:
				return true;
			default:
				break;
		}

		return super.onTouchEvent(event);
	}


	/**
     * 返回颜色
     */
    private int getColor(@ColorRes int color) {
        return ContextCompat.getColor(getContext(), color);
    }

    private void disableCopyPaste(){
		setLongClickable(false);
		setTextIsSelectable(false);
		setSelectAllOnFocus(false);
		setSelected(false);
		setCustomSelectionActionModeCallback(new ActionMode.Callback() {
			@Override
			public boolean onCreateActionMode(ActionMode mode, Menu menu) {
				return false;
			}

			@Override
			public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
				return false;
			}

			@Override
			public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
				return false;
			}

			@Override
			public void onDestroyActionMode(ActionMode mode) {

			}
		});
	}

	public void setFigures(int figures) {
		mFigures = figures;
		postInvalidate();
	}

	public void setVerCodeMargin(int margin) {
		mSingleCharMargin = margin;
		postInvalidate();
	}

	public void setBottomSelectedColor(@ColorRes int bottomSelectedColor) {
		mBottomSelectedColor = getColor(bottomSelectedColor);
		postInvalidate();
	}

	public void setBottomNormalColor(@ColorRes int bottomNormalColor) {
		mBottomSelectedColor = getColor(bottomNormalColor);
		postInvalidate();
	}

	public void setSelectedBackgroundColor(@ColorRes int selectedBackground) {
		mSelectedBackgroundColor = getColor(selectedBackground);
		postInvalidate();
	}

	public void setBottomLineHeight(int bottomLineHeight) {
		this.mBottomLineHeight = bottomLineHeight;
		postInvalidate();
	}

	public void setOnVerificationCodeChangedListener(OnVerificationCodeChangedListener listener) {
		this.mOnCodeChangedListener = listener;
	}

	public interface OnVerificationCodeChangedListener {
		void onVerCodeChanged(CharSequence s, int start, int before, int count);
		void onInputCompleted(CharSequence s);
	}
}
